﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TDArrayPractice
{
    class Program
    {
        static void Main(string[] args)
        {
            
        }


        //Создать массив - размеры массива выбирает пользователь из консоли. 
        //Заполнить массив случайными числами в диапазоне от 1 до 20. 
        //Вывести полученный массив на экран. 
        //Посчитать количество четных и нечетных элементов в массиве
        static void AmounEvenOddNumbers()
        {
            Console.Write("Enter amount of rows: ");
            int rows = Int32.Parse(Console.ReadLine());
            Console.Write("Enter amount of columns: ");
            int columns = Int32.Parse(Console.ReadLine());
            Console.Clear();

            int[,] resultArray = FillTwoDimensinalArrayByRandomNumbers(rows, columns, 1, 20);
            PrintTwoDimensinalArray(resultArray);

            int evenCounter = 0;
            int oddCounter = 0;
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < columns; j++)
                {
                    if (resultArray[i, j] % 2 == 0)
                    {
                        evenCounter++;
                    }
                    else
                        oddCounter++;
                }
            }
            Console.WriteLine("Count of even numbers: {0}", evenCounter);
            Console.WriteLine("Count of odd numbers: {0}", oddCounter);
        }


        //Создается массив из n строк и m столбцов.
        //Найти максимальный из наименьших элементов столбцов.
        static void FindMaxOfMin()
        {
            Console.Write("Enter amount of rows: ");
            int rows = Int32.Parse(Console.ReadLine());
            Console.Write("Enter amount of columns: ");
            int columns = Int32.Parse(Console.ReadLine());
            Console.Clear();

            int[,] resultArray = FillTwoDimensinalArrayByRandomNumbers(rows, columns, 1, 20);
            PrintTwoDimensinalArray(resultArray);

            int[] tempArray = new int[columns];
            for (int j = 0; j < columns; j++)
            {
                int min = Int32.MaxValue;
                for (int i = 0; i < rows; i++)
                {
                    if (resultArray[i, j] < min)
                    {
                        min = resultArray[i, j];
                    }
                }
                tempArray[j] = min;
                //Array of minimum elements of the initial array
                //Console.Write("[{0}] ", tempArray[j]);
            }
            Console.WriteLine("Maximum element of the minimum elements of the column {0}", tempArray.Max());
        }


        //Создать двумерный массив, заполненный случайными числами.
        //После заполнения — показать заполненный массив на экран и посчитать сумму элементов отдельно в каждом столбце и каждой строке.
        static void FindSumRowsColumns()
        {
            Console.Write("Enter amount of rows: ");
            int rows = Int32.Parse(Console.ReadLine());
            Console.Write("Enter amount of columns: ");
            int columns = Int32.Parse(Console.ReadLine());
            Console.Clear();

            int[,] resultArray = FillTwoDimensinalArrayByRandomNumbers(rows, columns, 1, 20);
            PrintTwoDimensinalArray(resultArray);

            int rowsSum = 0;
            int columnsSum = 0;
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < columns; j++)
                {
                    rowsSum += resultArray[i, j];
                }
                Console.WriteLine("Sum elements in the row [{0}]: {1}", i, rowsSum);
                rowsSum = 0;
            }
            for (int j = 0; j < columns; j++)
            {
                for (int i = 0; i < rows; i++)
                {
                    columnsSum += resultArray[i, j];
                }
                Console.WriteLine("Sum elements in the column [{0}]: {1}", j, columnsSum);
                columnsSum= 0;
            }
        }


        //Заполнить двумерный массив случайными числами от 10 до 100.
        //Посчитать сумму элементов отдельно в каждой строке и определить номер строки, в которой эта сумма максимальна.
        static void FindIndexOfMaxSumOfRows()
        {
            Console.Write("Enter amount of rows: ");
            int rows = Int32.Parse(Console.ReadLine());
            Console.Write("Enter amount of columns: ");
            int columns = Int32.Parse(Console.ReadLine());
            Console.Clear();

            int[,] resultArray = FillTwoDimensinalArrayByRandomNumbers(rows, columns, 10, 100);
            PrintTwoDimensinalArray(resultArray);

            int rowsSum = 0;
            int[] tempArray = new int[rows];
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < columns; j++)
                {
                    rowsSum += resultArray[i, j];
                }
                Console.WriteLine("Sum elements in the row [{0}]: {1}", i, rowsSum);
                tempArray[i] = rowsSum;
                rowsSum = 0;
            }
            int maxSum = tempArray.Max();
            int maxRowIndex = Array.IndexOf(tempArray, maxSum);
            Console.WriteLine("In row {0} maximum sum {1}", maxRowIndex, maxSum);
        }


        //Создать двумерный массив, заполненный случайными числами.
        //Найти произведение ненулевых элементов массива.
        static void CalculateMultiplicationOfNonZeroElementsOfArray()
        {
            Console.Write("Enter amount of rows: ");
            int rows = Int32.Parse(Console.ReadLine());
            Console.Write("Enter amount of columns: ");
            int columns = Int32.Parse(Console.ReadLine());
            Console.Clear();

            int[,] resultArray = FillTwoDimensinalArrayByRandomNumbers(rows, columns, 0, 5);
            PrintTwoDimensinalArray(resultArray);

            int mult = 1;
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < columns; j++)
                {
                    if(resultArray[i, j] != 0)
                    {
                        mult *= resultArray[i, j];
                    }
                }
            }
            Console.WriteLine("Multiplication of non zero elements of array: {0}", mult);

        }

        //Fill TD array by random numbers
        static int[,] FillTwoDimensinalArrayByRandomNumbers(int rowCount, int columnCount, int randomMinValue, int randomMaxValue)
        {
            int[,] array = new int[rowCount, columnCount];
            Random rnd = new Random();

            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {
                    array[i, j] = rnd.Next(randomMinValue, randomMaxValue + 1);
                }
            }
            return array;
        }

        //Print TD array to console
        static void PrintTwoDimensinalArray(int[,] arrayForPrint)
        {
            for (int i = 0; i < arrayForPrint.GetLength(0); i++)
            {
                for (int j = 0; j < arrayForPrint.GetLength(1); j++)
                {
                    Console.Write("{0}\t", arrayForPrint[i, j]);
                }
                Console.WriteLine();
            }
        }

    }
}